/*************************************************
 Copyright © DusunIoT 2005-2023. All rights reserved.
 File name: common_thread.h
 Author: yaoyuxi
 Version: V1.0
 Date: Tuesday, July 18, 2023 
 Description: 系统接口统一封装定义
 Others: none
 History: Created July 18, 2023  by:yaoyuxi
*************************************************/
#ifndef __COMMON_THREAD_H__
#define __COMMON_THREAD_H__

#include <stdio.h>
#include <stdint.h>
#include <stdarg.h>
#include <unistd.h>
#include <pthread.h>
#include "common_types.h"
#ifdef __cplusplus
    extern "C" {
#endif

/*线程优先级定义，越大优先级越高*/
typedef enum{
    COMMON_THREAD_PRIO_HIGH = 90,
    COMMON_THREAD_PRIO_MIDDLE = 60,
    COMMON_THREAD_PRIO_LOW = 40,
}COMMON_THREAD_PRIO_E;

#define COMMON_THREAD_PRIO_MIN    (1)  /*线程最小优先级为1*/
#define COMMON_THREAD_PRIO_MAX    (99)  /*线程最小优先级为1*/

#define THREAD_STACK_MIN_VAL    (1 << 22)  /*线程最小栈为4M字节*/
#define THREAD_STACK_SIZE_8M    (1 << 23)  /*线程栈为8M字节*/
#define THREAD_STACK_SIZE_16M   (1 << 24)  /*线程栈为16M字节*/


#define COMMON_THREAD_NAME_MAX_LEN    (32)  /*线程最大长度*/


#define THREAD_SLEEP_10MS      (10)  /*线程延时10ms*/
#define THREAD_SLEEP_20MS      (20)  /*线程延时20ms*/
#define THREAD_SLEEP_30MS      (30)  /*线程延时30ms*/
#define THREAD_SLEEP_50MS      (50)  /*线程延时50ms*/
#define THREAD_SLEEP_100MS     (100)  /*线程延时100ms*/
#define THREAD_SLEEP_200MS     (200)  /*线程延时200ms*/
#define THREAD_SLEEP_300MS     (300)  /*线程延时300ms*/
#define THREAD_SLEEP_500MS     (500)  /*线程延时500ms*/

/*线程延时接口封装*/
#define THREAD_MSLEEP(iSleepTime)        usleep(iSleepTime * 1000)


/*动态内存释放封装接口函数，开发中所有动态内存释放必须通过该接口进行*/
#define rb_free(pcMenAdrr)        do {if (RB_NULL != pcMenAdrr)  { free(pcMenAdrr); pcMenAdrr = RB_NULL; } } while(0)

    
/**@brief     动态内存申请封装接口函数，开发中所有动态内存使用必须通过该接口进行
* @param[in]  uiMemLen:申请内存大小
* @param[out] 无
* @return     pcMenAdrr:申请内存地址指针
*/
RB_UINT8 * rb_malloc(RB_UINT32 uiMemLen);


/**@brief     线程创建封装接口函数，开发中所有线程创建必须通过该接口进行
* @param[in]  iThreadPrio:线程优先级控制参数,优先级只支持COMMON_THREAD_PRIO_E中内容
* @param[in]  iThreadStackSize:线程栈默认大小控制参数
* @param[in]  pThreadFunc:线程执行函数指针
* @param[in]  pTreadArg:线程执行函数入参指针，只能有一个入参
* @param[out] stThreadId:线程ID
* @return     iRet:线程创建结果，如果为RB_OK则创建成功，其他返回值为创建失败
*/
RB_INT32 rb_pthread_create(pthread_t *pstThreadId, 
                                RB_INT32 iThreadPrio, 
                                size_t iThreadStackSize, 
                                RB_VOID *pThreadFunc, 
                                RB_VOID *pTreadArg);

/**@brief     设置线程名称封装接口函数，开发中所有线程都必须通过该接口设置名称
* @param[in]  pTreadName:线程控名字
* @return     RB_OK:线程名字设置成功,RB_ERR:线程名字设置失败
*/
RB_INT32 rb_pthread_set_name(RB_INT8 *pTreadName);

/**@brief     线程销毁封装接口函数，开发中所有线程销毁都必须通过该接口
* @param[in]  无
* @return     RB_OK:执行成功，其他执行失败
*/
RB_INT32 rb_pthread_cancel(RB_VOID);

/**@brief     线程消息封装接口函数，开发中所有线程销毁都必须通过该接口
* @param[in]  stThreadId:线程ID
* @param[out] pRetVal:线程销毁原因
* @return     RB_OK:执行成功，其他执行失败
*/
RB_INT32 rb_pthread_join(pthread_t stThreadId, RB_VOID *pRetVal);


#ifdef __cplusplus
}
#endif

#endif  //__COMMON_THREAD_H__

